/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.plugin.typescript.dto;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

/**
 * Mojo for generating TypeScript DTO interface + implementation for handling JSON data.
 * @author Florent Benoit
 */
@Mojo(name = "build",
      defaultPhase = LifecyclePhase.PACKAGE,
      requiresProject = true,
      requiresDependencyCollection = ResolutionScope.RUNTIME)
public class TypeScriptDTOGeneratorMojo extends AbstractMojo {

    /**
     * Project providing artifact id, version and dependencies.
     */
    @Parameter(defaultValue = "${project}", readonly = true)
    private MavenProject project;

    /**
     * build directory used to write the intermediate bom file.
     */
    @Parameter(defaultValue = "${project.build.directory}")
    private File targetDirectory;

    @Component
    private MavenProjectHelper projectHelper;

    /**
     * Path to the generated typescript file
     */
    private File typescriptFile;

    /**
     * Use of classpath instead of classloader
     */
    private boolean useClassPath;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {

        getLog().info("Generating TypeScript DTO");

        TypeScriptDtoGenerator typeScriptDtoGenerator = new TypeScriptDtoGenerator();

        typeScriptDtoGenerator.setUseClassPath(useClassPath);

        // define output path for the file to write with typescript definition
        String output = typeScriptDtoGenerator.execute();

        this.typescriptFile = new File(targetDirectory, project.getArtifactId() + ".ts");
        File parentDir = this.typescriptFile.getParentFile();
        if (!parentDir.exists() && !parentDir.mkdirs()) {
            throw new MojoExecutionException("Unable to create a directory for writing DTO typescript file '" + parentDir + "'.");
        }

        try (Writer fileWriter = Files.newBufferedWriter(this.typescriptFile.toPath(), StandardCharsets.UTF_8)) {
            fileWriter.write(output);
        } catch (IOException e) {
            throw new MojoExecutionException("Cannot write DTO typescript file");
        }

        // attach this typescript file as maven artifact
        projectHelper.attachArtifact(project, "ts", typescriptFile);
    }

    /**
     * Gets the TypeScript generated file
     * @return the generated file TypeScript link
     */
    public File getTypescriptFile() {
        return typescriptFile;
    }

    /**
     * Allow to configure generator to use classpath instead of classloader
     * @param useClassPath true if want to use classpath loading
     */
    public void setUseClassPath(boolean useClassPath) {
        this.useClassPath = useClassPath;
    }


}
